home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 22 / 2 / DISK2220.ZIP / SCREDIT4.EXE / VALIDATE.PAS < prev   
Pascal/Delphi Source File  |  1990-10-06  |  14KB  |  557 lines

  1. Procedure S_Find_Min_and_max;
  2. Begin
  3. FillChar(S_CompMin,81,00);
  4. FillChar(S_CompMax,81,00);
  5. S_Done := False;
  6. S_EndLine := False;
  7. While Not S_Done Do
  8.   Begin
  9.   S_Str_Ptr := S_Str_Ptr + 1;
  10.   If  S_Str_Ptr <= Length(S_CurStr) Then
  11.     Begin
  12.     If  S_CurStr[S_Str_Ptr] = #94 Then
  13.       Begin
  14.       S_Str_Ptr  := S_Str_Ptr + 1;
  15.       S_CompMax := S_CurStr[S_Str_Ptr]
  16.       End
  17.     Else
  18.       Begin
  19.       If  S_CurStr[S_Str_Ptr] = #39 Then
  20.         Begin
  21.         If  S_CompMax = '' Then
  22.           S_CompMax := S_CompMin;
  23.         S_Done := True;
  24.         End
  25.       Else
  26.         Begin
  27.         If  S_CompMax = '' then
  28.           S_CompMin := S_CompMin + S_CurStr[S_Str_Ptr]
  29.         Else
  30.           S_CompMax := S_CompMax + S_CurStr[S_Str_Ptr];
  31.         End;
  32.       End;
  33.     If  (S_CompMin = '\') or (S_CompMin = '=') Then
  34.       S_Done := True;
  35.     End
  36.   Else
  37.     Begin
  38.     S_Done := True;
  39.     If  S_CompMin = '' Then S_EndLine    := True;
  40.     End;
  41.   End;
  42. If  S_Upcase Then
  43.   Begin
  44.   S_CompMin := S_UpShiftedStr(S_CompMin);
  45.   S_CompMax := S_UpShiftedStr(S_CompMax);
  46.   End;
  47. S_AutoHelpMsg    := '';
  48. S_EditMask       := '';
  49. S_Force_EditMask := False;
  50. End;
  51.  
  52.  
  53.  
  54.  
  55.  
  56. Procedure S_ReadNextRangeRec;
  57. Begin
  58. With S_Validate^ Do
  59.   Begin
  60.   S_ValidateLine := S_NextLine;
  61.   If  S_VRec <> S_NextRec Then
  62.     Begin
  63.     S_VRec := S_NextRec;
  64.     Seek(S_File,S_NextRec);
  65.     Read(S_File,S_Validate^);
  66.     End;
  67.   S_NextRec  := S_RangeRec [S_ValidateLine];
  68.   S_NextLine := S_RangeLine[S_ValidateLine];
  69.   S_CurStr := S_RangeList[S_ValidateLine];
  70.   If  S_InIf Then S_Str_Ptr := 4 Else S_Str_Ptr := 1;
  71.   End;
  72. End;
  73.  
  74.  
  75.  
  76.  
  77.  
  78. Procedure S_ProcessDate;
  79. Label S_ProcessDate_Exit;
  80. Var
  81. TestLen,
  82. Error,
  83. M_Pos,
  84. D_Pos,
  85. Y_Pos     : Byte;
  86. T_Month,
  87. T_Day,
  88. T_Year    : Integer;
  89. DateMask  : String[30];
  90. WorkNum   : Integer;
  91.  
  92. Begin
  93. Error:= 0;
  94. M_Pos:= 0;
  95. D_Pos:= 0;
  96. Y_Pos:= 0;
  97.  
  98.  
  99. DateMask := Copy(S_CurStr,Pos('DATE',S_CurStr)+5,Length(S_CurStr)-Pos('DATE',S_CurStr)+4);
  100. S_Str_Ptr:= 1;
  101.  
  102. If  Length(DateMask) <> Length(S_NewStr) then Error := 1;
  103.  
  104. While ((Error = 0) and (S_Str_Ptr <= Length(DateMask))) do
  105.   Begin
  106.   Case DateMask[S_Str_Ptr] of
  107.    'Y' : If  Y_Pos = 0 Then
  108.            Begin
  109.            Y_Pos := S_Str_Ptr;
  110.            If  DateMask[S_Str_Ptr+2] = 'Y' Then TestLen := 4 Else TestLen := 2;
  111.            Val(Copy(S_NewStr,S_Str_Ptr,TestLen),T_Year,S_Result);
  112.            If  (S_Result > 0) Or (T_Year = 0) Then
  113.              Error := 2;
  114.            S_Str_Ptr := S_Str_Ptr + (TestLen - 1);
  115.            End;
  116.    'M' : If  M_Pos = 0 Then
  117.            Begin
  118.            M_Pos := S_Str_Ptr;
  119.            Val(Copy(S_NewStr,S_Str_Ptr,2),T_Month,S_Result);
  120.            If  (S_Result > 0) Or (T_Month = 0) Then Error := 3;
  121.              S_Str_Ptr := S_Str_Ptr + 1;
  122.            End;
  123.    'D' : If  D_Pos = 0 Then
  124.            Begin
  125.            D_Pos := S_Str_Ptr;
  126.            Val(Copy(S_NewStr,S_Str_Ptr,2),T_Day,S_Result);
  127.            If  (S_Result > 0) Or (T_Day = 0) Then Error := 4;
  128.            S_Str_Ptr := S_Str_Ptr + 1;
  129.            End;
  130.    Else
  131.      If  S_NewStr[S_Str_Ptr] <> DateMask [S_Str_Ptr] Then Error := 1;
  132.    End;{Case of}
  133.   S_Str_Ptr := S_Str_Ptr + 1;
  134.   End;
  135.  
  136. If  Error > 0 Then goto S_ProcessDate_Exit;
  137.  
  138. If  (M_Pos > 0) And (Not (T_Month In [1..12])) Then
  139.   Begin
  140.   Error := 6;{Invalid Month Specified}
  141.   goto S_ProcessDate_Exit;
  142.   End;
  143.  
  144. If  D_Pos > 0 Then
  145.   Begin
  146.   If  M_Pos > 0 Then
  147.     Begin
  148.     If  (T_Month In [1,3,5,7,8,10,12]) Then
  149.       Begin
  150.       If (T_Day > 31) Then Error := 8;
  151.       End
  152.     Else
  153.       Begin
  154.       If  (T_Month <> 2) Then
  155.         Begin
  156.         If  (T_Day > 30) Then Error := 9;
  157.         End
  158.       Else
  159.         Begin
  160.         If  (T_Year > 0) Then
  161.           Begin
  162.           If  (T_Year Mod 4) <> 0 Then
  163.             Begin
  164.             If  (T_Day > 28) Then Error := 10
  165.             End
  166.           Else
  167.             If  (T_Day > 29) Then Error := 11;
  168.           End
  169.         Else
  170.           If T_Day > 29 Then Error := 11;
  171.         End;
  172.       End;
  173.     End
  174.   Else
  175.     If  T_Day > 31 Then Error := 12;
  176.   End;
  177.  
  178.  
  179. S_ProcessDate_Exit:
  180.  
  181. If  Error > 0 Then
  182.   Begin
  183.   S_ScreenValid := False;
  184.   Case Error Of
  185.     1 : S_ErrorMsg := 'Please enter date in ' + DateMask + ' format.';
  186.     2 : S_ErrorMsg := 'Year contains invalid charcter.';
  187.     3 : S_ErrorMsg := 'Month contains invalid character.';
  188.     4 : S_ErrorMsg := 'Day of date contains invalid character.';
  189.     6 : S_ErrorMsg := 'Month must be 1 thru 12.';
  190.     8 : S_ErrorMsg := 'Only 31 Days in this month.';
  191.     9 : S_ErrorMsg := 'Only 30 Days in this month.';
  192.     10: S_ErrorMsg := 'February only has 28 days.';
  193.     11: S_ErrorMsg := 'February only has 29 days.';
  194.     12: S_ErrorMsg := 'Day can never exceed 31';
  195.   End;
  196.   End;
  197. End;
  198.  
  199.  
  200.  
  201.  
  202.  
  203. Procedure S_ProcessIN;
  204. Begin
  205. S_EndLine:= True;
  206. S_Matched:= False;
  207. S_Str_Ptr:= Pos('IN',S_CurStr)+3;
  208. S_CompMin[1]:= #32;
  209.  
  210. S_EditStr:= S_NewStr;
  211. If  S_Upcase Then
  212.   S_EditStr := S_UpShiftedStr(S_EditStr);
  213.  
  214. While Not((S_Matched) or (S_CompMin[1] IN ['\','='])) Do
  215.   Begin
  216.   S_Find_Min_and_max;
  217.   If  (S_CompMin <> '\')And(S_CompMin <> '=')And(Not S_EndLine) Then
  218.     Begin
  219.     S_GetFieldType(S_Field^.S_Type[S_Point]);
  220.     If  (S_FType In [0..7]) Then
  221.       Begin
  222.       S_Numeric   := 0;
  223.       S_CompMin_Numeric := 0;
  224.       S_CompMax_Numeric := 0;
  225.       Val(S_EditStr,S_Numeric,S_Result);
  226.       Val(S_CompMin,S_CompMin_Numeric,S_Result);
  227.       Val(S_CompMax,S_CompMax_Numeric,S_Result);
  228.       If  (S_Numeric >= S_CompMin_Numeric) And
  229.         (S_Numeric <= S_CompMax_Numeric) Then
  230.        S_Matched := True;
  231.       End
  232.     Else
  233.       Begin
  234.       If  (S_EditStr >= S_CompMin) And (S_EditStr <= S_CompMax) Then
  235.         S_Matched := True;
  236.       End;
  237.     End;
  238.   If  S_EndLine Then
  239.     Begin
  240.     S_EndLine := False;
  241.     S_ReadNextRangeRec;
  242.     S_Str_Ptr := S_Str_Ptr - 1;
  243.     Repeat
  244.       S_Str_Ptr := S_Str_Ptr + 1;
  245.     Until S_CurStr[S_Str_Ptr] IN [#39,'\','='];
  246.     If  S_CurStr[S_Str_Ptr] <> #39 Then
  247.       S_CompMin := S_CurStr[S_Str_Ptr];
  248.     End;
  249.   End;
  250.  
  251. If  S_Matched Then
  252.   Begin
  253.   While Not(S_CurStr[S_Str_Ptr] In ['\','=']) Do
  254.     Begin
  255.     S_Str_Ptr := Pos('\',S_CurStr);
  256.     If  S_Str_Ptr = 0 Then S_Str_Ptr := Pos('=',S_CurStr);
  257.     If  S_Str_Ptr = 0 Then
  258.       Begin
  259.       S_ReadNextRangeRec;
  260.       S_Str_Ptr := 1;
  261.       End;
  262.     End;
  263.   If  S_CurStr[S_Str_Ptr] = '=' then
  264.     Begin
  265.     S_ScreenValid := False;
  266.     S_ErrorMsg:= Copy(S_CurStr,(S_Str_Ptr+1),Length(S_CurStr));
  267.     End
  268.   Else
  269.     S_Matched := False;
  270.   End
  271. Else
  272.   Begin
  273.   If  S_CurStr[S_Str_Ptr] = '\' then
  274.     Begin
  275.     S_ScreenValid := False;
  276.     S_ErrorMsg:= Copy(S_CurStr,(S_Str_Ptr+1),Length(S_CurStr));
  277.     End
  278.   End;
  279. End;
  280.  
  281.  
  282.  
  283.  
  284.  
  285. Procedure S_ProcessIf;
  286. Var
  287. End_Loop,Or_Found,NOT_Found,THEN_Found : Boolean;
  288. CompField  : String[16];
  289.  
  290. Begin
  291. S_CompMin:= '';
  292. S_CompMax:= '';
  293. S_Matched:= FALSE;
  294. S_WorkStr:= S_EditStr;
  295. THEN_Found:= False;
  296. S_Skip:= False;
  297. While Not Then_Found do
  298.   Begin
  299.   If  Pos('NOT ',S_CurStr) = 4 Then
  300.     Begin
  301.     S_Str_Ptr:= 8;
  302.     NOT_Found:= True;
  303.     End
  304.   Else
  305.     Begin
  306.     S_Str_Ptr:= 4;
  307.     NOT_Found:= False;
  308.     End;
  309.   CompField:= '';
  310.   While S_CurStr[S_Str_Ptr] <> #39 Do
  311.     Begin
  312.     CompField:= CompField + UpCase(S_CurStr[S_Str_Ptr]);
  313.     S_Str_Ptr:= S_Str_Ptr + 1;
  314.     End;
  315.   S_FieldNo := 1;
  316.   S_Matched := False;
  317.   End_Loop  := False;
  318.  
  319.   While CompField <> S_UpShiftedStr(S_Field^.S_FieldName [S_FieldNo])Do
  320.     Begin
  321.     S_FieldNo := S_FieldNo + 1;
  322.     If  S_FieldNo > S_Indx^.S_Count[S_Num] Then
  323.       Begin
  324.       S_FieldNo := 1;
  325.       End_Loop  := True;
  326.       CompField := '';
  327.       S_Field^.S_FieldName[1]:='';
  328.       End;
  329.     End;
  330.  
  331.   S_Get_Field_Value(S_FieldNo);
  332.   S_EditStr  := S_TruncateStr(S_EditStr);
  333.  
  334.   If  S_Upcase Then S_EditStr := S_UpShiftedStr(S_EditStr);
  335.  
  336.   S_Matched:= False;
  337.   End_Loop := False;
  338.   While Not End_Loop do
  339.     Begin
  340.     Repeat
  341.       S_Find_Min_and_Max;
  342.       If  S_EndLine Then
  343.         Begin
  344.         S_ReadNextRangeRec;
  345.         S_Str_Ptr := Pos(Chr(39),S_CurStr);
  346.         End;
  347.     Until Not(S_EndLine);
  348.     If  ((S_CompMin='THEN') Or (S_CompMin='OR') Or (S_CompMin='AND')) Then
  349.       End_Loop := True;
  350.     If  Not((End_Loop) Or (S_Matched)) Then
  351.       Begin
  352.       S_GetFieldType(S_Field^.S_Type [S_FieldNo]);
  353.       If  (S_FType In [0..7]) Then
  354.         Begin
  355.         S_Numeric   := 0;
  356.         S_CompMin_Numeric := 0;
  357.         S_CompMax_Numeric := 0;
  358.         Val(S_EditStr,S_Numeric,S_Result);
  359.         Val(S_CompMin,S_CompMin_Numeric,S_Result);
  360.         Val(S_CompMax,S_CompMax_Numeric,S_Result);
  361.         If  Not_Found Then
  362.           Begin
  363.           If  (S_Numeric < S_CompMin_Numeric) Or
  364.               (S_Numeric > S_CompMax_Numeric) Then
  365.             S_Matched := True
  366.           End
  367.         Else
  368.           Begin
  369.           If  (S_Numeric >= S_CompMin_Numeric) And
  370.               (S_Numeric <= S_CompMax_Numeric) Then
  371.             S_Matched := True;
  372.           End;
  373.         End
  374.       Else
  375.         Begin
  376.         If  Not_Found Then
  377.           Begin
  378.           If  (S_EditStr < S_CompMin) Or (S_EditStr > S_CompMax) Then
  379.             S_Matched := True
  380.           End
  381.         Else
  382.           Begin
  383.           If  (S_EditStr >= S_CompMin) And (S_EditStr <= S_CompMax) Then
  384.             S_Matched := True;
  385.           End;
  386.         End;
  387.       End;
  388.     End;
  389.  
  390.   If  S_CompMin = 'AND' Then
  391.     Begin
  392.     If  Not S_Matched Then
  393.       Begin
  394.       Repeat
  395.         S_ReadNextRangeRec;
  396.       Until ((Pos('THEN',S_CurStr) = Length(S_CurStr)-3) Or
  397.             (Pos('OR',S_CurStr) = Length(S_CurStr)-1));
  398.       If  (Pos('OR',S_CurStr) = Length(S_CurStr)-1)   Then S_CompMin := 'OR';
  399.       If  (Pos('THEN',S_CurStr) = Length(S_CurStr)-3) Then Then_Found := True;
  400.       End
  401.     Else
  402.       S_ReadNextRangeRec;
  403.     End;
  404.  
  405.   If  S_CompMin = 'OR' Then
  406.     Begin
  407.     If  S_Matched Then
  408.       Repeat
  409.         S_ReadNextRangeRec;
  410.         If  (Pos('THEN',S_CurStr) = Length(S_CurStr)-3) Then Then_Found := True;
  411.       Until Then_Found
  412.     Else
  413.       S_ReadNextRangeRec;
  414.     End;
  415.   If  S_CompMin = 'THEN' Then Then_Found := True;
  416.   End;
  417.  
  418. If  S_Matched Then
  419.   Begin
  420.   S_Matched := False;
  421.   While S_CurStr <> 'ENDIF' Do
  422.     Begin
  423.     S_ReadNextRangeRec;
  424.     If  (Pos('ERROR',S_CurStr) = 4) Then
  425.       Begin
  426.       S_ScreenValid := False;
  427.       S_ErrorMsg         := Copy(S_CurStr,9,Length(S_CurStr));
  428.       End;
  429.     If  (Pos('DATE',S_CurStr) = 4) Then S_ProcessDate;
  430.     If  S_CurStr = '   SKIP' Then S_Skip := True;
  431.     If  (Pos('IN',S_CurStr) = 4) Then
  432.       Begin
  433.       S_Str_Ptr := 4;
  434.       S_InIf := True;
  435.       S_ProcessIn;
  436.       S_InIf := False;
  437.       End;
  438.     If  (S_ScreenValid = False) Or (S_Skip) Then
  439.       While S_CurStr <> 'ENDIF' Do S_ReadNextRangeRec
  440.     End;
  441.   End
  442. Else
  443.   While S_CurStr <> 'ENDIF' Do S_ReadNextRangeRec;
  444.  
  445. S_EditStr := S_WorkStr;
  446. End;
  447.  
  448.  
  449.  
  450.  
  451.  
  452. Procedure S_Validate_Location;
  453. Var
  454. WorkStr : String[1];
  455. Begin
  456. S_Upcase:= False;
  457. S_ScreenValid:= True;
  458. S_WorkStr:= '';
  459. S_Skip:= False;
  460.  
  461. With S_Validate^ do
  462.   Begin
  463.   While ((S_NextRec > 0) And (S_ScreenValid)) And (Not S_Skip) Do
  464.     Begin
  465.     S_ReadNextRangeRec;
  466.     If  (S_CurStr[1] = 'I') Then
  467.       If  S_CurStr[2] = 'F' Then S_ProcessIf Else S_ProcessIN;
  468.     If  S_CurStr [1] = 'U' Then
  469.       Begin
  470.       If  S_CurStr[11] = 'N' Then
  471.         Begin
  472.         S_Upcase := True;
  473.         S_EditStr := S_UpShiftedStr(S_EditStr);
  474.         End
  475.       Else
  476.         Begin
  477.         S_Upcase := False;
  478.         S_EditStr := S_NewStr;
  479.         End;
  480.       End;
  481.     If  (S_CurStr[1] = 'S') And (S_CurStr[2] = 'K') And (S_EditStr = '') Then
  482.       S_NextRec  := 0;
  483.     If  (S_CurStr[3] = 'Q') Then {Required}
  484.       Begin
  485.       If  S_EditStr =  '' Then
  486.         Begin
  487.         WorkStr[0] := #01;
  488.         WorkStr[1] := #39;
  489.         S_Str_Ptr  := Pos(WorkStr,S_CurStr);
  490.         S_ScreenValid := False;
  491.         If  S_Str_Ptr = 0 Then
  492.           S_ErrorMsg := 'This field is required'
  493.         Else
  494.           S_ErrorMsg := Copy(S_CurStr,(S_Str_Ptr+1),Length(S_CurStr)-S_Str_Ptr);
  495.         End;
  496.       End;
  497.     If  S_CurStr[1] = 'D' Then S_ProcessDate;
  498.       End;
  499.   End;
  500. End;
  501.  
  502.  
  503.  
  504.  
  505. Procedure S_ValidateScreen;
  506. Begin
  507. If  S_ValidateField > 0 Then S_Point := S_ValidateField Else S_Point := 1;
  508.  
  509. S_RecNo := 9999;
  510. S_ScreenValid := True;
  511. S_VDone := False;
  512.  
  513. {*** Changed ***}
  514. S_FieldCounter := 0;
  515. {*** Changes End ***}
  516.  
  517. While ((S_Point <= S_Indx^.S_Count[S_Num]) And (S_VDone = False)) Do
  518.   Begin
  519.   While (S_Field^.S_Type [S_Point] > 9) And
  520.     (S_FieldCounter <= S_Indx^.S_Count[S_Num]) do
  521.     Begin
  522.     S_FieldCounter := S_FieldCounter + 1;
  523.     S_Point := S_Field^.S_Next [S_Point];
  524.     End;
  525.   If  S_Point <= S_Indx^.S_Count[S_Num] then
  526.     Begin
  527.     S_Get_Field_Value(S_Point);
  528.     S_EditStr  := S_TruncateStr(S_EditStr);
  529.     S_NewStr   := S_EditStr;
  530.     S_NextRec  := S_Field^.S_RangeNextRec  [S_Point];
  531.     S_NextLine := S_Field^.S_RangeNextLine [S_Point];
  532.     S_Validate_Location;
  533.     If  S_ScreenValid  Then
  534.       Begin
  535.       If  S_ValidateField > 0 then
  536.         S_VDone := True
  537.       Else
  538.         S_Point := S_Point + 1;
  539.       End
  540.     Else
  541.       S_VDone := True;
  542.     End
  543.   Else
  544.     S_VDone := True;
  545.   End;
  546.  
  547. If  S_ScreenValid Then
  548.     S_Point := S_PrevFld
  549. Else
  550.     If S_IsDupe(S_Point) Then S_SetDupeFields := True;
  551. End;
  552.  
  553.  
  554.  
  555.  
  556.  
  557.